package com.yeskery.nut.extend.mcp.server;

import com.yeskery.nut.bean.BaseAnnotationMethodBeanPostProcessor;
import com.yeskery.nut.bind.FitValueHelper;
import com.yeskery.nut.extend.mcp.core.ExecuteExceptionHandler;
import com.yeskery.nut.util.ReflectUtils;

import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

/**
 * 基础Mcp bean后置处理器
 * @author sprout
 * 2025-04-24 14:36
 */
public abstract class BaseMcpBeanPostProcessor extends BaseAnnotationMethodBeanPostProcessor {

    /** mcp服务能力 */
    private final McpServerCapability mcpServerCapability;

    /** 异常处理器缓存 */
    private final Map<Class<?>, Object> exceptionHandlerCacheMap = new HashMap<>();

    /**
     * 构建基础Mcp bean后置处理器
     * @param mcpServerCapability mcp服务能力
     */
    protected BaseMcpBeanPostProcessor(McpServerCapability mcpServerCapability) {
        this.mcpServerCapability = mcpServerCapability;
    }

    /**
     * 获取mcp服务能力
     * @return mcp服务能力
     */
    protected McpServerCapability getMcpServerCapability() {
        return mcpServerCapability;
    }

    /**
     * 获取异常处理器
     * @param exceptionHandlerClass 异常处理器类
     * @return 异常处理器
     */
    protected ExecuteExceptionHandler getExceptionHandler(Class<? extends ExecuteExceptionHandler> exceptionHandlerClass) {
        if (!exceptionHandlerClass.equals(ExecuteExceptionHandler.class) && !exceptionHandlerClass.isInterface()) {
            int modifiers = exceptionHandlerClass.getModifiers();
            if (!Modifier.isStatic(modifiers) && !Modifier.isAbstract(modifiers) && Modifier.isPublic(modifiers)) {
                return (ExecuteExceptionHandler) ReflectUtils.getNoConstructorTarget(exceptionHandlerCacheMap, exceptionHandlerClass);
            }
        }
        return null;
    }

    /**
     * 是否是基本类型
     * @param type 类型
     * @return 是否是基本类型
     */
    protected boolean isBasicType(Class<?> type) {
        return FitValueHelper.getInstance().isBasicTypeClass(type);
    }
}
